In [1]:
import s3fs
import zarr
import xarray as xr
import pandas as pd
from dask.diagnostics import ProgressBar

Open three remote Zarr stores and put them in the cases dictionary.

In [2]:
case_paths = {
    "GLOBAL":"cobalt.GLOBAL02_CAM_ZARR/", 
    "GLOBAL_MAY_NAO":"cobalt.GLOBAL02.MAY.NAO_CAM_ZARR/",
    "GLOBAL_MAY_PAO":"cobalt.GLOBAL02.MAY.PAO_CAM_ZARR/",
}

cases = {}

# Initialize the S3 file system
s3 = s3fs.S3FileSystem()
for k,v in case_paths.items():
    s3_path = 's3://data-viz-server/{}'.format(v)
    store = s3fs.S3Map(root=s3_path, s3=s3, check=False)
    # Read Zarr file and put into cases dictionary
    cases[k] = xr.open_zarr(store=store, consolidated=True)

Each of the Zarr stores contains 114 variables indexed over latitude, longitude, and time. Here's their display() output. Notice that the first one has more time coordinates than the other two -- the time axis extends five years longer.

In [3]:
for c in cases.values():
    display(c)
<xarray.Dataset>
Dimensions:       (ilev: 27, lat: 192, lev: 26, lon: 288, nbnd: 2, slat: 191, slon: 288, time: 1033)
Coordinates:
  * ilev          (ilev) float64 2.194 4.895 9.882 18.05 ... 956.0 985.1 1e+03
  * lat           (lat) float64 -90.0 -89.06 -88.12 -87.17 ... 88.12 89.06 90.0
  * lev           (lev) float64 3.545 7.389 13.97 23.94 ... 929.6 970.6 992.6
  * lon           (lon) float64 0.0 1.25 2.5 3.75 ... 355.0 356.2 357.5 358.8
  * slat          (slat) float64 -89.53 -88.59 -87.64 ... 87.64 88.59 89.53
  * slon          (slon) float64 -0.625 0.625 1.875 3.125 ... 355.6 356.9 358.1
  * time          (time) object 2000-06-01 00:00:00 ... 2086-06-01 00:00:00
Dimensions without coordinates: nbnd
Data variables:
    AEROD_v       (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLDHGH        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLDICE        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    CLDLIQ        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    CLDLOW        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLDMED        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLDTOT        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLOUD         (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    CONCLD        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    DCQ           (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    DTCOND        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    DTV           (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    EMIS          (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    FICE          (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    FLDS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLDSC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLNS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLNSC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLNT          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLNTC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLUT          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLUTC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSDS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSDSC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSDTOA        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNSC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNT          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNTC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNTOA        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNTOAC       (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSUTOA        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    ICEFRAC       (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    ICIMR         (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    ICWMR         (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    LANDFRAC      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    LHFLX         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    LWCF          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    OCNFRAC       (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    OMEGA         (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    OMEGAT        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    P0            (time) float64 dask.array<chunksize=(1033,), meta=np.ndarray>
    PBLH          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PHIS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PRECC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PRECL         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PRECSC        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PRECSL        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PS            (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PSL           (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    Q             (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    QFLX          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    QREFHT        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    QRL           (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    QRS           (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    RELHUM        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    SFCLDICE      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SFCLDLIQ      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SHFLX         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SNOWHICE      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SNOWHLND      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SOLIN         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SWCF          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    T             (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    TAUX          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TAUY          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TGCLDCWP      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TGCLDIWP      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TGCLDLWP      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TMQ           (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TREFHT        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TS            (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TSMN          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TSMX          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    U             (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    U10           (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    UU            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    V             (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VD01          (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VQ            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VT            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VU            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VV            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    Z3            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    ch4vmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    co2vmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    date          (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    date_written  (time) |S8 dask.array<chunksize=(1,), meta=np.ndarray>
    datesec       (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    f11vmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    f12vmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    gw            (time, lat) float64 dask.array<chunksize=(1, 192), meta=np.ndarray>
    hyai          (time, ilev) float64 dask.array<chunksize=(1, 27), meta=np.ndarray>
    hyam          (time, lev) float64 dask.array<chunksize=(1, 26), meta=np.ndarray>
    hybi          (time, ilev) float64 dask.array<chunksize=(1, 27), meta=np.ndarray>
    hybm          (time, lev) float64 dask.array<chunksize=(1, 26), meta=np.ndarray>
    mdt           (time) int32 dask.array<chunksize=(1033,), meta=np.ndarray>
    n2ovmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    nbdate        (time) int32 dask.array<chunksize=(1033,), meta=np.ndarray>
    nbsec         (time) int32 dask.array<chunksize=(1033,), meta=np.ndarray>
    ndbase        (time) int32 dask.array<chunksize=(1033,), meta=np.ndarray>
    ndcur         (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    nlon          (time, lat) int32 dask.array<chunksize=(1, 192), meta=np.ndarray>
    nsbase        (time) int32 dask.array<chunksize=(1033,), meta=np.ndarray>
    nscur         (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    nsteph        (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    ntrk          (time) int32 dask.array<chunksize=(1033,), meta=np.ndarray>
    ntrm          (time) int32 dask.array<chunksize=(1033,), meta=np.ndarray>
    ntrn          (time) int32 dask.array<chunksize=(1033,), meta=np.ndarray>
    sol_tsi       (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    time_bnds     (time, nbnd) object dask.array<chunksize=(1033, 2), meta=np.ndarray>
    time_written  (time) |S8 dask.array<chunksize=(1,), meta=np.ndarray>
    w_stag        (time, slat) float64 dask.array<chunksize=(1, 191), meta=np.ndarray>
    wnummax       (time, lat) int32 dask.array<chunksize=(1, 192), meta=np.ndarray>
Attributes:
    Conventions:      CF-1.0
    Version:          $Name$
    case:             f09_g16.B.cobalt.GLOBAL02
    host:             n716022
    initial_file:     f09_g16.B.04.EXT.cam.i.2077-05-01-00000.nc
    logname:          clmfrm01
    revision_Id:      $Id$
    source:           CAM
    title:            UNSET
    topography_file:  /e/04/clmfrm/din/atm/cam/topo/USGS-gtopo30_0.9x1.25_rem...
<xarray.Dataset>
Dimensions:       (ilev: 27, lat: 192, lev: 26, lon: 288, nbnd: 2, slat: 191, slon: 288, time: 969)
Coordinates:
  * ilev          (ilev) float64 2.194 4.895 9.882 18.05 ... 956.0 985.1 1e+03
  * lat           (lat) float64 -90.0 -89.06 -88.12 -87.17 ... 88.12 89.06 90.0
  * lev           (lev) float64 3.545 7.389 13.97 23.94 ... 929.6 970.6 992.6
  * lon           (lon) float64 0.0 1.25 2.5 3.75 ... 355.0 356.2 357.5 358.8
  * slat          (slat) float64 -89.53 -88.59 -87.64 ... 87.64 88.59 89.53
  * slon          (slon) float64 -0.625 0.625 1.875 3.125 ... 355.6 356.9 358.1
  * time          (time) object 2000-06-01 00:00:00 ... 2081-02-01 00:00:00
Dimensions without coordinates: nbnd
Data variables:
    AEROD_v       (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLDHGH        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLDICE        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    CLDLIQ        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    CLDLOW        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLDMED        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLDTOT        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLOUD         (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    CONCLD        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    DCQ           (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    DTCOND        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    DTV           (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    EMIS          (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    FICE          (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    FLDS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLDSC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLNS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLNSC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLNT          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLNTC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLUT          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLUTC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSDS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSDSC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSDTOA        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNSC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNT          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNTC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNTOA        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNTOAC       (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSUTOA        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    ICEFRAC       (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    ICIMR         (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    ICWMR         (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    LANDFRAC      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    LHFLX         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    LWCF          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    OCNFRAC       (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    OMEGA         (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    OMEGAT        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    P0            (time) float64 dask.array<chunksize=(969,), meta=np.ndarray>
    PBLH          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PHIS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PRECC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PRECL         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PRECSC        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PRECSL        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PS            (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PSL           (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    Q             (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    QFLX          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    QREFHT        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    QRL           (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    QRS           (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    RELHUM        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    SFCLDICE      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SFCLDLIQ      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SHFLX         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SNOWHICE      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SNOWHLND      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SOLIN         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SWCF          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    T             (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    TAUX          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TAUY          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TGCLDCWP      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TGCLDIWP      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TGCLDLWP      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TMQ           (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TREFHT        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TS            (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TSMN          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TSMX          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    U             (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    U10           (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    UU            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    V             (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VD01          (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VQ            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VT            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VU            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VV            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    Z3            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    ch4vmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    co2vmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    date          (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    date_written  (time) |S8 dask.array<chunksize=(1,), meta=np.ndarray>
    datesec       (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    f11vmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    f12vmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    gw            (time, lat) float64 dask.array<chunksize=(1, 192), meta=np.ndarray>
    hyai          (time, ilev) float64 dask.array<chunksize=(1, 27), meta=np.ndarray>
    hyam          (time, lev) float64 dask.array<chunksize=(1, 26), meta=np.ndarray>
    hybi          (time, ilev) float64 dask.array<chunksize=(1, 27), meta=np.ndarray>
    hybm          (time, lev) float64 dask.array<chunksize=(1, 26), meta=np.ndarray>
    mdt           (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    n2ovmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    nbdate        (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    nbsec         (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    ndbase        (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    ndcur         (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    nlon          (time, lat) int32 dask.array<chunksize=(1, 192), meta=np.ndarray>
    nsbase        (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    nscur         (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    nsteph        (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    ntrk          (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    ntrm          (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    ntrn          (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    sol_tsi       (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    time_bnds     (time, nbnd) object dask.array<chunksize=(969, 2), meta=np.ndarray>
    time_written  (time) |S8 dask.array<chunksize=(1,), meta=np.ndarray>
    w_stag        (time, slat) float64 dask.array<chunksize=(1, 191), meta=np.ndarray>
    wnummax       (time, lat) int32 dask.array<chunksize=(1, 192), meta=np.ndarray>
Attributes:
    Conventions:      CF-1.0
    Version:          $Name$
    case:             f09_g16.B.cobalt.GLOBAL02.MAY.NAO
    host:             n716016
    initial_file:     f09_g16.B.04.EXT.cam.i.2068-05-01-00000.nc
    logname:          clmfrm01
    revision_Id:      $Id$
    source:           CAM
    title:            UNSET
    topography_file:  /e/04/clmfrm/din/atm/cam/topo/USGS-gtopo30_0.9x1.25_rem...
<xarray.Dataset>
Dimensions:       (ilev: 27, lat: 192, lev: 26, lon: 288, nbnd: 2, slat: 191, slon: 288, time: 969)
Coordinates:
  * ilev          (ilev) float64 2.194 4.895 9.882 18.05 ... 956.0 985.1 1e+03
  * lat           (lat) float64 -90.0 -89.06 -88.12 -87.17 ... 88.12 89.06 90.0
  * lev           (lev) float64 3.545 7.389 13.97 23.94 ... 929.6 970.6 992.6
  * lon           (lon) float64 0.0 1.25 2.5 3.75 ... 355.0 356.2 357.5 358.8
  * slat          (slat) float64 -89.53 -88.59 -87.64 ... 87.64 88.59 89.53
  * slon          (slon) float64 -0.625 0.625 1.875 3.125 ... 355.6 356.9 358.1
  * time          (time) object 2000-06-01 00:00:00 ... 2081-02-01 00:00:00
Dimensions without coordinates: nbnd
Data variables:
    AEROD_v       (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLDHGH        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLDICE        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    CLDLIQ        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    CLDLOW        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLDMED        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLDTOT        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    CLOUD         (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    CONCLD        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    DCQ           (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    DTCOND        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    DTV           (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    EMIS          (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    FICE          (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    FLDS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLDSC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLNS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLNSC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLNT          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLNTC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLUT          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FLUTC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSDS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSDSC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSDTOA        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNSC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNT          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNTC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNTOA        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSNTOAC       (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    FSUTOA        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    ICEFRAC       (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    ICIMR         (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    ICWMR         (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    LANDFRAC      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    LHFLX         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    LWCF          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    OCNFRAC       (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    OMEGA         (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    OMEGAT        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    P0            (time) float64 dask.array<chunksize=(969,), meta=np.ndarray>
    PBLH          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PHIS          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PRECC         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PRECL         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PRECSC        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PRECSL        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PS            (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    PSL           (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    Q             (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    QFLX          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    QREFHT        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    QRL           (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    QRS           (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    RELHUM        (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    SFCLDICE      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SFCLDLIQ      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SHFLX         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SNOWHICE      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SNOWHLND      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SOLIN         (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    SWCF          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    T             (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    TAUX          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TAUY          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TGCLDCWP      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TGCLDIWP      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TGCLDLWP      (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TMQ           (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TREFHT        (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TS            (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TSMN          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    TSMX          (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    U             (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    U10           (time, lat, lon) float32 dask.array<chunksize=(1, 192, 288), meta=np.ndarray>
    UU            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    V             (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VD01          (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VQ            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VT            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VU            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    VV            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    Z3            (time, lev, lat, lon) float32 dask.array<chunksize=(1, 26, 192, 288), meta=np.ndarray>
    ch4vmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    co2vmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    date          (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    date_written  (time) |S8 dask.array<chunksize=(1,), meta=np.ndarray>
    datesec       (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    f11vmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    f12vmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    gw            (time, lat) float64 dask.array<chunksize=(1, 192), meta=np.ndarray>
    hyai          (time, ilev) float64 dask.array<chunksize=(1, 27), meta=np.ndarray>
    hyam          (time, lev) float64 dask.array<chunksize=(1, 26), meta=np.ndarray>
    hybi          (time, ilev) float64 dask.array<chunksize=(1, 27), meta=np.ndarray>
    hybm          (time, lev) float64 dask.array<chunksize=(1, 26), meta=np.ndarray>
    mdt           (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    n2ovmr        (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    nbdate        (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    nbsec         (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    ndbase        (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    ndcur         (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    nlon          (time, lat) int32 dask.array<chunksize=(1, 192), meta=np.ndarray>
    nsbase        (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    nscur         (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    nsteph        (time) int32 dask.array<chunksize=(1,), meta=np.ndarray>
    ntrk          (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    ntrm          (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    ntrn          (time) int32 dask.array<chunksize=(969,), meta=np.ndarray>
    sol_tsi       (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    time_bnds     (time, nbnd) object dask.array<chunksize=(969, 2), meta=np.ndarray>
    time_written  (time) |S8 dask.array<chunksize=(1,), meta=np.ndarray>
    w_stag        (time, slat) float64 dask.array<chunksize=(1, 191), meta=np.ndarray>
    wnummax       (time, lat) int32 dask.array<chunksize=(1, 192), meta=np.ndarray>
Attributes:
    Conventions:      CF-1.0
    Version:          $Name$
    case:             f09_g16.B.cobalt.GLOBAL02.MAY.PAO
    host:             n716016
    initial_file:     f09_g16.B.04.EXT.cam.i.2066-05-01-00000.nc
    logname:          clmfrm01
    revision_Id:      $Id$
    source:           CAM
    title:            UNSET
    topography_file:  /e/04/clmfrm/din/atm/cam/topo/USGS-gtopo30_0.9x1.25_rem...

Concatenating these datasets works fine and implicitly uses the NaN fillvalue.

In [4]:
# concatenate dataset along new Index dim using dictionary keys
data = xr.concat(
    objs=cases.values(), 
    dim=pd.Index(list(cases.keys()), name='ao_phase', dtype='U15')
) 
data
Out[4]:
<xarray.Dataset>
Dimensions:       (ao_phase: 3, ilev: 27, lat: 192, lev: 26, lon: 288, nbnd: 2, slat: 191, slon: 288, time: 1033)
Coordinates:
  * lat           (lat) float64 -90.0 -89.06 -88.12 -87.17 ... 88.12 89.06 90.0
  * lon           (lon) float64 0.0 1.25 2.5 3.75 ... 355.0 356.2 357.5 358.8
  * slon          (slon) float64 -0.625 0.625 1.875 3.125 ... 355.6 356.9 358.1
  * time          (time) object 2000-06-01 00:00:00 ... 2086-06-01 00:00:00
  * lev           (lev) float64 3.545 7.389 13.97 23.94 ... 929.6 970.6 992.6
  * slat          (slat) float64 -89.53 -88.59 -87.64 ... 87.64 88.59 89.53
  * ilev          (ilev) float64 2.194 4.895 9.882 18.05 ... 956.0 985.1 1e+03
  * ao_phase      (ao_phase) object 'GLOBAL' 'GLOBAL_MAY_NAO' 'GLOBAL_MAY_PAO'
Dimensions without coordinates: nbnd
Data variables:
    AEROD_v       (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    CLDHGH        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    CLDICE        (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    CLDLIQ        (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    CLDLOW        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    CLDMED        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    CLDTOT        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    CLOUD         (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    CONCLD        (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    DCQ           (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    DTCOND        (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    DTV           (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    EMIS          (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    FICE          (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    FLDS          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FLDSC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FLNS          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FLNSC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FLNT          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FLNTC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FLUT          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FLUTC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSDS          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSDSC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSDTOA        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSNS          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSNSC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSNT          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSNTC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSNTOA        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSNTOAC       (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSUTOA        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    ICEFRAC       (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    ICIMR         (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    ICWMR         (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    LANDFRAC      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    LHFLX         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    LWCF          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    OCNFRAC       (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    OMEGA         (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    OMEGAT        (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    P0            (ao_phase, time) float64 dask.array<chunksize=(1, 1033), meta=np.ndarray>
    PBLH          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    PHIS          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    PRECC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    PRECL         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    PRECSC        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    PRECSL        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    PS            (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    PSL           (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    Q             (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    QFLX          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    QREFHT        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    QRL           (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    QRS           (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    RELHUM        (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    SFCLDICE      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    SFCLDLIQ      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    SHFLX         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    SNOWHICE      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    SNOWHLND      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    SOLIN         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    SWCF          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    T             (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    TAUX          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TAUY          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TGCLDCWP      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TGCLDIWP      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TGCLDLWP      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TMQ           (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TREFHT        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TS            (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TSMN          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TSMX          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    U             (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    U10           (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    UU            (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    V             (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    VD01          (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    VQ            (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    VT            (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    VU            (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    VV            (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    Z3            (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    ch4vmr        (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    co2vmr        (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    date          (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    date_written  (ao_phase, time) object dask.array<chunksize=(1, 1), meta=np.ndarray>
    datesec       (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    f11vmr        (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    f12vmr        (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    gw            (ao_phase, time, lat) float64 dask.array<chunksize=(1, 1, 192), meta=np.ndarray>
    hyai          (ao_phase, time, ilev) float64 dask.array<chunksize=(1, 1, 27), meta=np.ndarray>
    hyam          (ao_phase, time, lev) float64 dask.array<chunksize=(1, 1, 26), meta=np.ndarray>
    hybi          (ao_phase, time, ilev) float64 dask.array<chunksize=(1, 1, 27), meta=np.ndarray>
    hybm          (ao_phase, time, lev) float64 dask.array<chunksize=(1, 1, 26), meta=np.ndarray>
    mdt           (ao_phase, time) float64 dask.array<chunksize=(1, 1033), meta=np.ndarray>
    n2ovmr        (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    nbdate        (ao_phase, time) float64 dask.array<chunksize=(1, 1033), meta=np.ndarray>
    nbsec         (ao_phase, time) float64 dask.array<chunksize=(1, 1033), meta=np.ndarray>
    ndbase        (ao_phase, time) float64 dask.array<chunksize=(1, 1033), meta=np.ndarray>
    ndcur         (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    nlon          (ao_phase, time, lat) float64 dask.array<chunksize=(1, 1, 192), meta=np.ndarray>
    nsbase        (ao_phase, time) float64 dask.array<chunksize=(1, 1033), meta=np.ndarray>
    nscur         (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    nsteph        (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    ntrk          (ao_phase, time) float64 dask.array<chunksize=(1, 1033), meta=np.ndarray>
    ntrm          (ao_phase, time) float64 dask.array<chunksize=(1, 1033), meta=np.ndarray>
    ntrn          (ao_phase, time) float64 dask.array<chunksize=(1, 1033), meta=np.ndarray>
    sol_tsi       (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    time_bnds     (ao_phase, time, nbnd) object dask.array<chunksize=(1, 1033, 2), meta=np.ndarray>
    time_written  (ao_phase, time) object dask.array<chunksize=(1, 1), meta=np.ndarray>
    w_stag        (ao_phase, time, slat) float64 dask.array<chunksize=(1, 1, 191), meta=np.ndarray>
    wnummax       (ao_phase, time, lat) float64 dask.array<chunksize=(1, 1, 192), meta=np.ndarray>
Attributes:
    Conventions:      CF-1.0
    Version:          $Name$
    case:             f09_g16.B.cobalt.GLOBAL02
    host:             n716022
    initial_file:     f09_g16.B.04.EXT.cam.i.2077-05-01-00000.nc
    logname:          clmfrm01
    revision_Id:      $Id$
    source:           CAM
    title:            UNSET
    topography_file:  /e/04/clmfrm/din/atm/cam/topo/USGS-gtopo30_0.9x1.25_rem...

However, when we write the new dataset to a Zarr store it presents a SerializationWarning and informs us that a numpy typecast has failed.

In [5]:
# define custom Zarr compressor
compressor = zarr.Blosc(cname='zstd', clevel=3, shuffle=2)
encoding = {vname: {'compressor': compressor} for vname in data.variables}
s3_out_path='s3://data-viz-server/CAM_data_EXAMPLE.zarr/'
out_store = s3fs.S3Map(root=s3_out_path, s3=s3, check=False)

with ProgressBar():
    zs = data.to_zarr(out_store, encoding=encoding, consolidated=True)
[########################################] | 100% Completed |  6.4s
/home/ubuntu/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/conventions.py:188: SerializationWarning: variable None has data in the form of a dask array with dtype=object, which means it is being loaded into memory to determine a data type that can be safely stored on disk. To avoid this, coerce this variable to a fixed-size dtype with astype() before saving it.
  SerializationWarning,
[########################################] | 100% Completed | 16.4s
[########################################] | 100% Completed |  5.6s
/home/ubuntu/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/conventions.py:188: SerializationWarning: variable None has data in the form of a dask array with dtype=object, which means it is being loaded into memory to determine a data type that can be safely stored on disk. To avoid this, coerce this variable to a fixed-size dtype with astype() before saving it.
  SerializationWarning,
[########################################] | 100% Completed | 16.4s
[########################################] | 100% Completed |  0.1s
[########################################] | 100% Completed |  0.1s
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-078f027b4301> in <module>
      6 
      7 with ProgressBar():
----> 8     zs = data.to_zarr(out_store, encoding=encoding, consolidated=True)

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/core/dataset.py in to_zarr(self, store, mode, synchronizer, group, encoding, compute, consolidated, append_dim)
   1656             compute=compute,
   1657             consolidated=consolidated,
-> 1658             append_dim=append_dim,
   1659         )
   1660 

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/backends/api.py in to_zarr(dataset, store, mode, synchronizer, group, encoding, compute, consolidated, append_dim)
   1351     writer = ArrayWriter()
   1352     # TODO: figure out how to properly handle unlimited_dims
-> 1353     dump_to_store(dataset, zstore, writer, encoding=encoding)
   1354     writes = writer.sync(compute=compute)
   1355 

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/backends/api.py in dump_to_store(dataset, store, writer, encoder, encoding, unlimited_dims)
   1126         variables, attrs = encoder(variables, attrs)
   1127 
-> 1128     store.store(variables, attrs, check_encoding, writer, unlimited_dims=unlimited_dims)
   1129 
   1130 

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/backends/zarr.py in store(self, variables, attributes, check_encoding_set, writer, unlimited_dims)
    394         variables_without_encoding = {vn: variables[vn] for vn in new_variables}
    395         variables_encoded, attributes = self.encode(
--> 396             variables_without_encoding, attributes
    397         )
    398 

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/backends/common.py in encode(self, variables, attributes)
    230 
    231         """
--> 232         variables = {k: self.encode_variable(v) for k, v in variables.items()}
    233         attributes = {k: self.encode_attribute(v) for k, v in attributes.items()}
    234         return variables, attributes

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/backends/common.py in <dictcomp>(.0)
    230 
    231         """
--> 232         variables = {k: self.encode_variable(v) for k, v in variables.items()}
    233         attributes = {k: self.encode_attribute(v) for k, v in attributes.items()}
    234         return variables, attributes

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/backends/zarr.py in encode_variable(self, variable)
    351 
    352     def encode_variable(self, variable):
--> 353         variable = encode_zarr_variable(variable)
    354         return variable
    355 

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/backends/zarr.py in encode_zarr_variable(var, needs_copy, name)
    243     """
    244 
--> 245     var = conventions.encode_cf_variable(var, name=name)
    246 
    247     # zarr allows unicode, but not variable-length strings, so it's both

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/conventions.py in encode_cf_variable(var, needs_copy, name)
    248         variables.UnsignedIntegerCoder(),
    249     ]:
--> 250         var = coder.encode(var, name=name)
    251 
    252     # TODO(shoyer): convert all of these to use coders, too:

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/coding/times.py in encode(self, variable, name)
    412         ):
    413             (data, units, calendar) = encode_cf_datetime(
--> 414                 data, encoding.pop("units", None), encoding.pop("calendar", None)
    415             )
    416             safe_setitem(attrs, "units", units, name=name)

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/coding/times.py in encode_cf_datetime(dates, units, calendar)
    355 
    356     if units is None:
--> 357         units = infer_datetime_units(dates)
    358     else:
    359         units = _cleanup_netcdf_time_units(units)

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/coding/times.py in infer_datetime_units(dates)
    249         reference_date = dates[0] if len(dates) > 0 else "1970-01-01"
    250         reference_date = format_cftime_datetime(reference_date)
--> 251     unique_timedeltas = np.unique(np.diff(dates))
    252     if unique_timedeltas.dtype == np.dtype("O"):
    253         # Convert to np.timedelta64 objects using pandas to work around a

<__array_function__ internals> in diff(*args, **kwargs)

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/numpy/lib/function_base.py in diff(a, n, axis, prepend, append)
   1278     op = not_equal if a.dtype == np.bool_ else subtract
   1279     for _ in range(n):
-> 1280         a = op(a[slice1], a[slice2])
   1281 
   1282     return a

TypeError: unsupported operand type(s) for -: 'float' and 'cftime._cftime.DatetimeNoLeap'

If we remove the offending times prior to Zarr'ing, everything works.

In [7]:
# find the times that are not represented across all three datasets
sets = [ set(x.time.values) for x in cases.values() ]
times_to_drop = set.union(*sets) - set.intersection(*sets)
times_to_drop
Out[7]:
{cftime.DatetimeNoLeap(2081, 3, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2081, 4, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2081, 5, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2081, 6, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2081, 7, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2081, 8, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2081, 9, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2081, 10, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2081, 11, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2081, 12, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2082, 1, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2082, 2, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2082, 3, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2082, 4, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2082, 5, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2082, 6, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2082, 7, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2082, 8, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2082, 9, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2082, 10, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2082, 11, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2082, 12, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2083, 1, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2083, 2, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2083, 3, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2083, 4, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2083, 5, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2083, 6, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2083, 7, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2083, 8, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2083, 9, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2083, 10, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2083, 11, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2083, 12, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2084, 1, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2084, 2, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2084, 3, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2084, 4, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2084, 5, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2084, 6, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2084, 7, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2084, 8, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2084, 9, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2084, 10, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2084, 11, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2084, 12, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2085, 1, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2085, 2, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2085, 3, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2085, 4, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2085, 5, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2085, 6, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2085, 7, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2085, 8, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2085, 9, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2085, 10, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2085, 11, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2085, 12, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2086, 1, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2086, 2, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2086, 3, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2086, 4, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2086, 5, 1, 0, 0, 0, 0),
 cftime.DatetimeNoLeap(2086, 6, 1, 0, 0, 0, 0)}
In [8]:
# drop those times
for k in cases.keys():
    cases[k] = cases[k].drop_sel(time=sorted(list(times_to_drop)), errors='ignore')
In [9]:
# verify that all three datasets in `cases` have the same time coordinates
for c in cases.values():
    print(c.time)
<xarray.DataArray 'time' (time: 969)>
array([cftime.DatetimeNoLeap(2000, 6, 1, 0, 0, 0, 0),
       cftime.DatetimeNoLeap(2000, 7, 1, 0, 0, 0, 0),
       cftime.DatetimeNoLeap(2000, 8, 1, 0, 0, 0, 0), ...,
       cftime.DatetimeNoLeap(2080, 12, 1, 0, 0, 0, 0),
       cftime.DatetimeNoLeap(2081, 1, 1, 0, 0, 0, 0),
       cftime.DatetimeNoLeap(2081, 2, 1, 0, 0, 0, 0)], dtype=object)
Coordinates:
  * time     (time) object 2000-06-01 00:00:00 ... 2081-02-01 00:00:00
Attributes:
    bounds:     time_bnds
    long_name:  time
<xarray.DataArray 'time' (time: 969)>
array([cftime.DatetimeNoLeap(2000, 6, 1, 0, 0, 0, 0),
       cftime.DatetimeNoLeap(2000, 7, 1, 0, 0, 0, 0),
       cftime.DatetimeNoLeap(2000, 8, 1, 0, 0, 0, 0), ...,
       cftime.DatetimeNoLeap(2080, 12, 1, 0, 0, 0, 0),
       cftime.DatetimeNoLeap(2081, 1, 1, 0, 0, 0, 0),
       cftime.DatetimeNoLeap(2081, 2, 1, 0, 0, 0, 0)], dtype=object)
Coordinates:
  * time     (time) object 2000-06-01 00:00:00 ... 2081-02-01 00:00:00
Attributes:
    bounds:     time_bnds
    long_name:  time
<xarray.DataArray 'time' (time: 969)>
array([cftime.DatetimeNoLeap(2000, 6, 1, 0, 0, 0, 0),
       cftime.DatetimeNoLeap(2000, 7, 1, 0, 0, 0, 0),
       cftime.DatetimeNoLeap(2000, 8, 1, 0, 0, 0, 0), ...,
       cftime.DatetimeNoLeap(2080, 12, 1, 0, 0, 0, 0),
       cftime.DatetimeNoLeap(2081, 1, 1, 0, 0, 0, 0),
       cftime.DatetimeNoLeap(2081, 2, 1, 0, 0, 0, 0)], dtype=object)
Coordinates:
  * time     (time) object 2000-06-01 00:00:00 ... 2081-02-01 00:00:00
Attributes:
    bounds:     time_bnds
    long_name:  time

Concatenate the modified cases dictionary.

In [10]:
data2 = xr.concat(
    objs=cases.values(), 
    dim=pd.Index(list(cases.keys()), name='ao_phase', dtype='U15')
) 
data2
Out[10]:
<xarray.Dataset>
Dimensions:       (ao_phase: 3, ilev: 27, lat: 192, lev: 26, lon: 288, nbnd: 2, slat: 191, slon: 288, time: 969)
Coordinates:
  * lat           (lat) float64 -90.0 -89.06 -88.12 -87.17 ... 88.12 89.06 90.0
  * lon           (lon) float64 0.0 1.25 2.5 3.75 ... 355.0 356.2 357.5 358.8
  * slon          (slon) float64 -0.625 0.625 1.875 3.125 ... 355.6 356.9 358.1
  * time          (time) object 2000-06-01 00:00:00 ... 2081-02-01 00:00:00
  * lev           (lev) float64 3.545 7.389 13.97 23.94 ... 929.6 970.6 992.6
  * slat          (slat) float64 -89.53 -88.59 -87.64 ... 87.64 88.59 89.53
  * ilev          (ilev) float64 2.194 4.895 9.882 18.05 ... 956.0 985.1 1e+03
  * ao_phase      (ao_phase) object 'GLOBAL' 'GLOBAL_MAY_NAO' 'GLOBAL_MAY_PAO'
Dimensions without coordinates: nbnd
Data variables:
    AEROD_v       (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    CLDHGH        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    CLDICE        (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    CLDLIQ        (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    CLDLOW        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    CLDMED        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    CLDTOT        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    CLOUD         (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    CONCLD        (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    DCQ           (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    DTCOND        (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    DTV           (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    EMIS          (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    FICE          (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    FLDS          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FLDSC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FLNS          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FLNSC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FLNT          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FLNTC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FLUT          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FLUTC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSDS          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSDSC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSDTOA        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSNS          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSNSC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSNT          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSNTC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSNTOA        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSNTOAC       (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    FSUTOA        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    ICEFRAC       (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    ICIMR         (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    ICWMR         (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    LANDFRAC      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    LHFLX         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    LWCF          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    OCNFRAC       (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    OMEGA         (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    OMEGAT        (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    P0            (ao_phase, time) float64 dask.array<chunksize=(1, 969), meta=np.ndarray>
    PBLH          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    PHIS          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    PRECC         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    PRECL         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    PRECSC        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    PRECSL        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    PS            (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    PSL           (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    Q             (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    QFLX          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    QREFHT        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    QRL           (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    QRS           (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    RELHUM        (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    SFCLDICE      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    SFCLDLIQ      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    SHFLX         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    SNOWHICE      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    SNOWHLND      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    SOLIN         (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    SWCF          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    T             (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    TAUX          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TAUY          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TGCLDCWP      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TGCLDIWP      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TGCLDLWP      (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TMQ           (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TREFHT        (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TS            (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TSMN          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    TSMX          (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    U             (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    U10           (ao_phase, time, lat, lon) float32 dask.array<chunksize=(1, 1, 192, 288), meta=np.ndarray>
    UU            (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    V             (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    VD01          (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    VQ            (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    VT            (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    VU            (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    VV            (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    Z3            (ao_phase, time, lev, lat, lon) float32 dask.array<chunksize=(1, 1, 26, 192, 288), meta=np.ndarray>
    ch4vmr        (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    co2vmr        (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    date          (ao_phase, time) int32 dask.array<chunksize=(1, 1), meta=np.ndarray>
    date_written  (ao_phase, time) |S8 dask.array<chunksize=(1, 1), meta=np.ndarray>
    datesec       (ao_phase, time) int32 dask.array<chunksize=(1, 1), meta=np.ndarray>
    f11vmr        (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    f12vmr        (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    gw            (ao_phase, time, lat) float64 dask.array<chunksize=(1, 1, 192), meta=np.ndarray>
    hyai          (ao_phase, time, ilev) float64 dask.array<chunksize=(1, 1, 27), meta=np.ndarray>
    hyam          (ao_phase, time, lev) float64 dask.array<chunksize=(1, 1, 26), meta=np.ndarray>
    hybi          (ao_phase, time, ilev) float64 dask.array<chunksize=(1, 1, 27), meta=np.ndarray>
    hybm          (ao_phase, time, lev) float64 dask.array<chunksize=(1, 1, 26), meta=np.ndarray>
    mdt           (ao_phase, time) int32 dask.array<chunksize=(1, 969), meta=np.ndarray>
    n2ovmr        (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    nbdate        (ao_phase, time) int32 dask.array<chunksize=(1, 969), meta=np.ndarray>
    nbsec         (ao_phase, time) int32 dask.array<chunksize=(1, 969), meta=np.ndarray>
    ndbase        (ao_phase, time) int32 dask.array<chunksize=(1, 969), meta=np.ndarray>
    ndcur         (ao_phase, time) int32 dask.array<chunksize=(1, 1), meta=np.ndarray>
    nlon          (ao_phase, time, lat) int32 dask.array<chunksize=(1, 1, 192), meta=np.ndarray>
    nsbase        (ao_phase, time) int32 dask.array<chunksize=(1, 969), meta=np.ndarray>
    nscur         (ao_phase, time) int32 dask.array<chunksize=(1, 1), meta=np.ndarray>
    nsteph        (ao_phase, time) int32 dask.array<chunksize=(1, 1), meta=np.ndarray>
    ntrk          (ao_phase, time) int32 dask.array<chunksize=(1, 969), meta=np.ndarray>
    ntrm          (ao_phase, time) int32 dask.array<chunksize=(1, 969), meta=np.ndarray>
    ntrn          (ao_phase, time) int32 dask.array<chunksize=(1, 969), meta=np.ndarray>
    sol_tsi       (ao_phase, time) float64 dask.array<chunksize=(1, 1), meta=np.ndarray>
    time_bnds     (ao_phase, time, nbnd) object dask.array<chunksize=(1, 969, 2), meta=np.ndarray>
    time_written  (ao_phase, time) |S8 dask.array<chunksize=(1, 1), meta=np.ndarray>
    w_stag        (ao_phase, time, slat) float64 dask.array<chunksize=(1, 1, 191), meta=np.ndarray>
    wnummax       (ao_phase, time, lat) int32 dask.array<chunksize=(1, 1, 192), meta=np.ndarray>
Attributes:
    Conventions:      CF-1.0
    Version:          $Name$
    case:             f09_g16.B.cobalt.GLOBAL02
    host:             n716022
    initial_file:     f09_g16.B.04.EXT.cam.i.2077-05-01-00000.nc
    logname:          clmfrm01
    revision_Id:      $Id$
    source:           CAM
    title:            UNSET
    topography_file:  /e/04/clmfrm/din/atm/cam/topo/USGS-gtopo30_0.9x1.25_rem...

Upload the new dataset to Zarr. This works -- I interrupted this execution several minutes in (it takes ~1 hour), but I have seen it proceed to completion.

In [11]:
# define custom Zarr compressor
compressor = zarr.Blosc(cname='zstd', clevel=3, shuffle=2)
encoding = {vname: {'compressor': compressor} for vname in data2.variables}
s3_out_path='s3://data-viz-server/CAM_data_EXAMPLE_not_ragged.zarr/'
out_store = s3fs.S3Map(root=s3_out_path, s3=s3, check=False)

with ProgressBar():
    zs = data2.to_zarr(out_store, encoding=encoding, consolidated=True)
[########################################] | 100% Completed |  0.1s
[########################################] | 100% Completed |  0.1s
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-11-4566116cd1ef> in <module>
      6 
      7 with ProgressBar():
----> 8     zs = data2.to_zarr(out_store, encoding=encoding, consolidated=True)

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/core/dataset.py in to_zarr(self, store, mode, synchronizer, group, encoding, compute, consolidated, append_dim)
   1656             compute=compute,
   1657             consolidated=consolidated,
-> 1658             append_dim=append_dim,
   1659         )
   1660 

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/backends/api.py in to_zarr(dataset, store, mode, synchronizer, group, encoding, compute, consolidated, append_dim)
   1352     # TODO: figure out how to properly handle unlimited_dims
   1353     dump_to_store(dataset, zstore, writer, encoding=encoding)
-> 1354     writes = writer.sync(compute=compute)
   1355 
   1356     if compute:

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/xarray/backends/common.py in sync(self, compute)
    202                 compute=compute,
    203                 flush=True,
--> 204                 regions=self.regions,
    205             )
    206             self.sources = []

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/dask/array/core.py in store(sources, targets, lock, regions, compute, return_stored, **kwargs)
    889     sources_dsk = HighLevelGraph.merge(*[e.__dask_graph__() for e in sources])
    890     sources_dsk = Array.__dask_optimize__(
--> 891         sources_dsk, list(core.flatten([e.__dask_keys__() for e in sources]))
    892     )
    893     sources2 = [Array(sources_dsk, e.name, e.chunks, meta=e) for e in sources]

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/dask/array/optimization.py in optimize(dsk, keys, fuse_keys, fast_functions, inline_functions_fast_functions, rename_fused_keys, **kwargs)
     55         hold + keys + (fuse_keys or []),
     56         dependencies,
---> 57         rename_keys=rename_fused_keys,
     58     )
     59     if inline_functions_fast_functions:

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/dask/optimization.py in fuse(dsk, keys, dependencies, ave_width, max_width, max_height, max_depth_new_edges, rename_keys, fuse_subgraphs)
    839     if key_renamer:
    840         for root_key, fused_keys in fused_trees.items():
--> 841             alias = key_renamer(fused_keys)
    842             if alias is not None and alias not in rv:
    843                 rv[alias] = rv[root_key]

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/dask/optimization.py in default_fused_keys_renamer(keys, max_fused_key_length)
    404         return _enforce_max_key_limit(concatenated_name)
    405     elif typ is tuple and len(first_key) > 0 and isinstance(first_key[0], str):
--> 406         first_name = key_split(first_key)
    407         names = {key_split(k) for k in it}
    408         names.discard(first_name)

~/anaconda3/envs/bokenv/lib/python3.7/site-packages/dask/optimization.py in key_split(s)
    972             return "data"
    973         else:
--> 974             if result[0] == "<":
    975                 result = result.strip("<>").split()[0].split(".")[-1]
    976             return result

KeyboardInterrupt: 
In [ ]: